package clasificador.genetico.reglas;

import java.util.ArrayList;
import java.util.Arrays;
import utils.Copyable;
import utils.Tuple;

public final class TGenotipo extends ArrayList<Tuple<int[],Integer>> 
implements Copyable<TGenotipo>
{
    /* Cada regla es una asociacion entre una lista de enteros, representando los posibles valores de cada atri
     * buto y un entero, representando la clase final.
     * 
     * Los bits del entero que representa los valores posibles de un atributo que no corresponden a ningun valor
     * posible, estaran siempre a cero, de forma que se pueda hacer la evaluacion de cada atributo
     * mediante un and bit a bit de este entero con el correspondiente del dato.
     */
    public TGenotipo()
    {
    	super();
    }
    
    public TGenotipo(int size)
    {
        super(size);
    }
    
    public static Tuple<int[],Integer> copyRegla(Tuple<int[],Integer> regla)
    {
    	int[] cuerpo = Arrays.copyOf(regla.l(), regla.l().length);
        Integer clase = regla.r();
        return new Tuple<>(cuerpo,clase);
    }
    public TGenotipo copy() {
        TGenotipo self = new TGenotipo(this.size());
        
        for(Tuple<int[], Integer> regla : this) {            
            self.add(copyRegla(regla));
        }
        
        assert self.toString().equals(this.toString());

        return self;
    }
    
    @Override
    public String toString()
    {
        String r = "";
        for(Tuple<int[],Integer> regla: this)
        {
            r+= "IF ";
            for(int i = 0; i < regla.l().length; i++)
            {
                r+="a"+i+" IN ("+Integer.toBinaryString(regla.l()[i])+") AND ";
            }
            r+= " THEN " + Integer.toBinaryString(regla.r());
            r+= " || ";
        }
        
        return r;
    }
}
